﻿/**
 * Sección:
 * - Operaciones básicas: activar y desactivar, con sus respectivos difusores de eventos.
 *
 * Reserva los siguientes nombres: Seccion_ref, activar, desactivar, Seccion_inicializar.
 */
class Seccion {
	private var Seccion_ref:Seccion;

	public static var wrap:Function = aplicar;
	private var clip_seccion:MovieClip;
	
	private var transicion_activar,
	transicion_desactivar:Transicion;
	
	/**
	 * @param transiciones: Object = {transicion_activar, transicion_desactivar, transicion_resaltar, transicion_desresaltar}
	 */
	public static function aplicar(receptor:MovieClip, transiciones:Object):MovieClip {
		// For some compilers that force to asign new objects to a variable.
		var seccion:Seccion = new Seccion(receptor, transiciones);
		return receptor;
	}
	
	public function Seccion(receptor:MovieClip, transiciones:Object) {
		//trace("Seccion: " + receptor);
		EventDispatcherWrapper.aplicar(receptor);
		
		/* TODO Los atributos que no vengan definidos reemplazarlos por una transición predeterminada. */
		transicion_activar = transiciones.transicion_activar;
		transicion_desactivar = transiciones.transicion_desactivar;
		
		receptor.Seccion_ref = this;
		receptor.Seccion_ref.clip_seccion = receptor;
		receptor.Seccion_inicializar = Seccion_inicializar;
		receptor.activar = activar;
		receptor.desactivar = desactivar;
		receptor.Seccion_inicializar();
	}

	private function Seccion_inicializar():Void {
		Seccion_ref.transicion_activar.addEventListener("fin_transicion", Seccion_ref);
		Seccion_ref.transicion_desactivar.addEventListener("fin_transicion", Seccion_ref);
		//Seccion_ref.clip_seccion = this;
	}
	
	public function fin_transicion(evt:Object):Void {
		var type:String;
		switch(evt.target) {
			case transicion_activar:
			type = "fin_activar";
			break;
			case transicion_desactivar:
			type = "fin_desactivar";
			break;
		}
		//trace("Seccion.fin_transicion, type: " + type + ".");
		clip_seccion.dispatchEvent({type: type, target: clip_seccion, extra_param_transicion: evt});
	}
	
	public function activar():Void {
		dispatchEvent({type: "ini_activar", target: this});
		Seccion_ref.transicion_desactivar.cancelar();
		Seccion_ref.transicion_activar.hacer_gradual();
	}
	
	public function desactivar():Void {
		dispatchEvent({type: "ini_desactivar", target: this});
		Seccion_ref.transicion_activar.cancelar();
		Seccion_ref.transicion_desactivar.hacer_gradual();
	}
	
	function dispatchEvent() {}
}